
const data = [
  { id: '01', pid: '', 'name': '老王' },
  { id: '02', pid: '01', 'name': '小张' },
  { id: '03', pid: '01', 'name': '小正' },
  { id: '04', pid: '01', 'name': '小李' },
  { id: '05', pid: '04', 'name': '小兆' },
  { id: '06', pid: '03', 'name': '小倩' },
  { id: '07', pid: '03', 'name': '小孙' },
  { id: '08', pid: '07', 'name': '小周' }
]

// 1、定义一个转树的方法，参数（数组对象）
// 2、声明一个tree = []，存储最终产出的树状数据
// 3、声明一个对象 map = {} , 用来把数组对象转成对象，map对象的键是子对象的id，值是子对象，并且每个子对象都有一个children属性，children=[]
// 4、实现第3步，遍历数组对象，给每个子对象添加属性，children=[]，再把每个子对象存到map对象中，map[item.id]=item
// 5、遍历数组对象，声明parent= map[item.pid]，如果能在map中找到这个属性，说明这个属性就是当前item的上级，把当前item添加到parent当前属性的children中；否则，就没有上级，直接添加到tree数组中
// 6、最后，return tree

function toTree(list) {
  // 最终要产出的树状数据的数组
  const treeList = []
  // 所有项都使用对象存储起来
  const map = {}
  // 建立一个映射关系：通过id快速找到对应的元素
  list.forEach(item => {
    if (!item.children) {
      item.children = []
    }
    map[item.id] = item
  })
  // map = {
  //   {id:"01", pid:"",   "name":"老王" },
  //   {id:"02", pid:"01", "name":"小张" }, ...
  //  }
  list.forEach(item => {
    // 对于每一个元素来说，先找它的上级
    //    如果能找到，说明它有上级，则要把它添加到上级的children中去
    //    如果找不到，说明它没有上级，直接添加到 treeList
    const parent = map[item.pid]
    if (parent) { // 如果存在上级则表示item不是最顶层的数据
      parent.children.push(item)
    } else { // 如果不存在上级 则是顶层数据,直接添加
      treeList.push(item)
    }
  })
  // 把结果返回出去
  return treeList
}

console.log(toTree(data))

// function toTreeData(data, pid) {
//   var tree = []
//   var temp = []
//   for (var i = 0; i < data.length; i++) {
//     if (data[i].parent === pid) {
//       var obj = data[i]
//       temp = this.toTreeData(data, data[i].id)
//       if (temp.length > 0) {
//         obj.children = temp
//       }
//       tree.push(obj)
//     }
//   }
//   return tree
// }
// var nodes = [
//   { 'id': 2, 'title': '第一级1', 'parentid': 0 },
//   { 'id': 3, 'title': '第二级1', 'parentid': 2 },
//   { 'id': 4, 'title': '第二级2', 'parentid': 2 },
//   { 'id': 5, 'title': '第三级1', 'parentid': 4 },
//   { 'id': 6, 'title': '第三级2', 'parentid': 3 }
// ]
// const treeData = toTreeData(nodes, 0)
// console.log(treeData)

// const listToTree = (list, tree, parentId) => {
//   list.forEach(item => {
//     // 判断是否为父级菜单
//     if (item.parentId === parentId) {
//       const child = {
//         ...item,
//         key: item.key || item.name,
//         children: []
//       }
//       // 迭代 list， 找到当前菜单相符合的所有子菜单
//       listToTree(list, child.children, item.id)
//       // 删掉不存在 children 值的属性
//       if (child.children.length <= 0) {
//         delete child.children
//       }
//       // 加入到树中
//       tree.push(child)
//     }
//   })
// }

// console.log(listToTree(data, [], ''))

